using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Media;

namespace In_Game
{
    public class Game1 : Microsoft.Xna.Framework.Game
    {
        GraphicsDeviceManager graphics;
        SpriteBatch spriteBatch;

        //Teste
        Texture2D texturaRetangulo;

        EstadoJogo estadoJogo;

        // Menu
        Texture2D imagemTitulo;
        Texture2D selecaoInicio;
        Texture2D texturaSeta;
        Animacao animacaoSeta;
        Animacao animacaoSetaJogo;
        Vector2 posicaoSeta;
        KeyboardState teclado;
        int jogadores = 1;
        int menuJogo = 0;

        bool enterPress = false;
        bool multplayer = false;
        bool comecar = false;
        bool pause = false;
        Texture2D texturaPause;
        Animacao animacaoPause;

        // Mapa
        Texture2D mapa;
        Vector2 posicaoMapa;
        Animacao animacaoMapa;

        // Hud
        SpriteFont fonte;
        Texture2D imagemHud;
        Texture2D imagemVida;
        Texture2D texturaHp;
        Texture2D imagemGameOver;
        int dano = 0;
        int dano2 = 0;
        //int fase = 1;
        int score = 0;
        int score2 = 0;
        
        // Heroi
        Texture2D texturaHeroi;
        Heroi heroi;
        Heroi heroi2;
        Vector2 posicaoHeroi;
        Vector2 posicaoHeroi2;
        Tiro tiro;
        List<Tiro> tiros = new List<Tiro>();
        Tiro tiro2;
        List<Tiro> tiros2 = new List<Tiro>();
        Texture2D texturaTiro;
        //int vida = 5;

        // Inimigos

        Texture2D texturaInimigo;
        //Animacao animacaoInimigo;
        //Inimigo inimigo = new Inimigo();
        //Inimigo inimigo2 = new Inimigo();
        List<Inimigo> listaInimigos = new List<Inimigo>();
        Vector2 posicaoInimigo;

        Texture2D TexturaExplsao;
        List<Animacao> explosoes = new List<Animacao>();
        Animacao explosao;


        TimeSpan tempoInimigo = TimeSpan.FromSeconds(2f);
        TimeSpan tempoInimigoTotal = new TimeSpan(0, 0, 0);
        Random randon = new Random();

        public Game1()
        {
            graphics = new GraphicsDeviceManager(this);
            Content.RootDirectory = "Content";

            graphics.PreferredBackBufferWidth = 800;
            graphics.PreferredBackBufferHeight = 600;
        }

        protected override void Initialize()
        {
            estadoJogo = EstadoJogo.TITULO;
            
            base.Initialize();
        }

        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            //Teste
            texturaRetangulo = Content.Load<Texture2D>("Imagens/retangulo");

            //Menu
            imagemTitulo = Content.Load<Texture2D>("Imagens/entrada");
            selecaoInicio = Content.Load<Texture2D>("Imagens/letreiro_entrada");
            texturaSeta = Content.Load<Texture2D>("Imagens/seta_selecao");
            posicaoSeta = new Vector2(Window.ClientBounds.Width / 2 - 145, Window.ClientBounds.Height / 2 + 43);
            animacaoSeta = new Animacao(texturaSeta, posicaoSeta, Point.Zero, 49, 109, 4, 5, Color.White, 1, true, true);
            animacaoSetaJogo = new Animacao(texturaSeta, new Vector2(335, 288), Point.Zero, 49, 109, 4, 5, Color.White, .5f, true, true);
            texturaPause = Content.Load<Texture2D>("Imagens/pause");
            animacaoPause = new Animacao(texturaPause, new Vector2(Window.ClientBounds.Width / 2 - 90, Window.ClientBounds.Height / 2 - 50), new Point(0, 0), 154, 119, 3, 3, Color.White, 1, true, true);

            //Mapa
            mapa = Content.Load<Texture2D>("Imagens/sprite_cenario");
            posicaoMapa = new Vector2(2, 103);

            animacaoMapa = new Animacao(mapa, posicaoMapa, new Point(0, mapa.Height - 600), 796, 600, 4, 2, Color.White, 1, true, true);

            //Hud
            fonte = Content.Load<SpriteFont>("fonte");
            texturaHp = Content.Load<Texture2D>("Imagens/huds");
            imagemHud = Content.Load<Texture2D>("Imagens/hud");
            imagemVida = Content.Load<Texture2D>("Imagens/vida");
            imagemGameOver = Content.Load<Texture2D>("Imagens/gameOver");
            
            //Heroi
            texturaHeroi = Content.Load<Texture2D>("Imagens/sprites_leni");
            texturaTiro = Content.Load<Texture2D>("Imagens/tiro");
            posicaoHeroi = new Vector2(370, 300);
           
            heroi = new Heroi(GraphicsDevice, texturaHeroi, posicaoHeroi, tiro, texturaTiro, 1);
           

            //Heroi 2
            
            posicaoHeroi2 = new Vector2(500, 300);
            heroi2 = new Heroi(GraphicsDevice, Content.Load<Texture2D>("Imagens/sprites_leni2"), posicaoHeroi2, tiro, texturaTiro, 2);

            // Inimigos
            texturaInimigo = Content.Load<Texture2D>("Imagens/enemies_sprites");
            TexturaExplsao = Content.Load<Texture2D>("Imagens/explosao_enemies");
            posicaoInimigo = new Vector2(500, 200);

            //inimigo.Inicializacao(texturaInimigo, inimigo.animacao, inimigo.posicao = new Vector2(500, 200), EstadoInimigo.ESQUERDA);
            //inimigo2.Inicializacao(texturaInimigo, inimigo2.animacao, inimigo2.posicao = new Vector2(200, 0), EstadoInimigo.BAIXO);
            //listaInimigos.Add(new Inimigo(texturaInimigo, new Vector2(500, 200), EstadoInimigo.ESQUERDA));
            //listaInimigos.Add(inimigo2);
           
            explosao = new Animacao(TexturaExplsao, Vector2.Zero, new Point(0, 0), 140, 114, 3, 5, Color.White, 1, false, false);
            //explosao.ativo = false;    
            
            

            
        }

        protected override void UnloadContent()
        {
            
        }

        public void Pause()
        {
            foreach (Inimigo ini in listaInimigos)
            {
                ini.direcao = Vector2.Zero;
                ini.animacao.tempoDecorrido--;
                heroi.pause = true;
            }
        }

        public void AddInimigos(GameTime gameTime)
        {
            if (pause == false)
            {
                if (jogadores == 1)
                {
                    listaInimigos.Add(new Inimigo(texturaInimigo, new Vector2(randon.Next(20, 780), -50), EstadoInimigo.BAIXO, 1));
                    listaInimigos.Add(new Inimigo(texturaInimigo, new Vector2(-20, randon.Next(20, 680)), EstadoInimigo.BAIXO, 1));
                }

                if (jogadores == 2)
                {
                    listaInimigos.Add(new Inimigo(texturaInimigo, new Vector2(randon.Next(20, 780), -50), EstadoInimigo.BAIXO, randon.Next(1, 4)));
                    listaInimigos.Add(new Inimigo(texturaInimigo, new Vector2(-20, randon.Next(20, 680)), EstadoInimigo.BAIXO, randon.Next(1, 4)));
                }
            }
            
            tempoInimigoTotal = TimeSpan.FromSeconds(0);
        }

        public void Colizao()
        {
            for (int i = 0; i < listaInimigos.Count; i++)
            {
                if(heroi.retangulo.Intersects(listaInimigos[i].retanguloColisao))
                {
                    //listaInimigos[i].posicao -= listaInimigos[i].direcao * 100;
                    heroi.posicao += listaInimigos[i].direcao * 10;
                    heroi.HP -= 10;
                    dano += 1;
                    heroi.atingido = true;
                    listaInimigos[i].HP = 0;

                    if (listaInimigos[i].HP <= 0)
                    {
                        explosoes.Add(new Animacao(TexturaExplsao, new Vector2(listaInimigos[i].posicao.X - 30, listaInimigos[i].posicao.Y - 50), new Point(0, 0), 140, 114, 3, 5, Color.White, 1, false, true));
                    }

                    if (heroi.cima)
                    {
                        heroi.animacaoHeroiDanoCima.ativo = true;
                        heroi.estadoHeroi = EstadoHeroi.DANO_C;
                    }

                    if (heroi.baixo)
                    {
                        heroi.animacaoHeroiDanoBaixo.ativo = true;
                        heroi.estadoHeroi = EstadoHeroi.DANO_B;
                    }

                    if (heroi.direita)
                    {
                        heroi.estadoHeroi = EstadoHeroi.DANO_D;
                        heroi.animacaoHeroiDanoDireita.ativo = true;
                    }

                    if (heroi.esquerda)
                    {
                        heroi.estadoHeroi = EstadoHeroi.DANO_E;
                        heroi.animacaoHeroiDanoEsquerda.ativo = true;
                    }

                    if (heroi.HP <= 0)
                    {
                        estadoJogo = EstadoJogo.GAMEOVER;
                    }
                }

            }

                for (int t = 0; t < tiros.Count; t++)
                {
                    for (int j = 0; j < listaInimigos.Count; j++)
                    {

                        if (tiros[t].retanguloTiro.Intersects(listaInimigos[j].retanguloColisao))
                        {
                            listaInimigos[j].HP -= 100;
                            tiros[t].ativo = false;

                            if (listaInimigos[j].HP <= 0)
                            {
                                explosoes.Add(new Animacao(TexturaExplsao, new Vector2(listaInimigos[j].posicao.X - 30, listaInimigos[j].posicao.Y - 50), new Point(0, 0), 140, 114, 3, 5, Color.White, 1, false, true));
                                score += 100;
                            }
                        }  
                    }
                }
        }

        public void Colizao2()
        {
            for (int i = 0; i < listaInimigos.Count; i++)
            {
                if (heroi2.retangulo.Intersects(listaInimigos[i].retanguloColisao))
                {
                    //listaInimigos[i].posicao -= listaInimigos[i].direcao * 100;
                    heroi2.posicao += listaInimigos[i].direcao * 10;
                    heroi2.HP -= 10;
                    heroi2.atingido = true;
                    listaInimigos[i].HP = 0;
                    dano2++;

                    if (listaInimigos[i].HP <= 0)
                    {
                        explosoes.Add(new Animacao(TexturaExplsao, new Vector2(listaInimigos[i].posicao.X - 30, listaInimigos[i].posicao.Y - 50), new Point(0, 0), 140, 114, 3, 5, Color.White, 1, false, true));
                    }

                    if (heroi2.cima)
                    {
                        heroi2.animacaoHeroiDanoCima.ativo = true;
                        heroi2.estadoHeroi = EstadoHeroi.DANO_C;
                    }

                    if (heroi2.baixo)
                    {
                        heroi2.animacaoHeroiDanoBaixo.ativo = true;
                        heroi2.estadoHeroi = EstadoHeroi.DANO_B;
                    }

                    if (heroi2.direita)
                    {
                        heroi2.estadoHeroi = EstadoHeroi.DANO_D;
                        heroi2.animacaoHeroiDanoDireita.ativo = true;
                    }

                    if (heroi2.esquerda)
                    {
                        heroi2.estadoHeroi = EstadoHeroi.DANO_E;
                        heroi2.animacaoHeroiDanoEsquerda.ativo = true;
                    }

                    if (heroi2.HP <= 0)
                    {
                        estadoJogo = EstadoJogo.GAMEOVER;
                    }
                }

            }

            for (int t = 0; t < tiros2.Count; t++)
            {
                for (int j = 0; j < listaInimigos.Count; j++)
                {

                    if (tiros2[t].retanguloTiro.Intersects(listaInimigos[j].retanguloColisao))
                    {
                        listaInimigos[j].HP -= 100;
                        tiros2[t].ativo = false;

                        if (listaInimigos[j].HP <= 0)
                        {
                            explosoes.Add(new Animacao(TexturaExplsao, new Vector2(listaInimigos[j].posicao.X - 30, listaInimigos[j].posicao.Y - 50), new Point(0, 0), 140, 114, 3, 5, Color.White, 1, false, true));
                            score += 100;
                        }
                    }
                }
            }
        }

        public void Inicio()
        {
            //heroi
            if (jogadores == 1)
            {
                heroi.posicao = new Vector2(370, 300);
            }

            if (jogadores == 2)
            {
                heroi.posicao = new Vector2(200, 300);
                imagemHud = Content.Load<Texture2D>("Imagens/hud2");
                heroi2.posicao = new Vector2(500, 300);
            }

            heroi.estadoHeroi = EstadoHeroi.PARADO_B;
            heroi.baixo = true;
            heroi.esquerda = false;
            heroi.direita = false;
            heroi.cima = false;
            score = 0;
            heroi.HP = 100;
            heroi2.HP = 100;
            dano = 0;
        }

        protected override void Update(GameTime gameTime)
        {
            teclado = Keyboard.GetState();
            KeyboardState prevKeyboard = Keyboard.GetState();
            
            switch (estadoJogo)
            {
                case EstadoJogo.TITULO:
                    
                    
                    animacaoSeta.Update(gameTime);
                    animacaoSeta.posicao = posicaoSeta;
                    Inicio();
                    if (Keyboard.GetState().IsKeyDown(Keys.Enter) && enterPress == false)
                    {
                        enterPress = true;
                       
                        if (comecar == true)
                        {
                            multplayer = false;
                            
                            estadoJogo = EstadoJogo.PLAY;
                        }

                        multplayer = true;
                    }

                    if (Keyboard.GetState().IsKeyUp(Keys.Enter))
                    {
                        enterPress = false;
                        comecar = false;
                    }

                    if (multplayer == true)
                    {
                        if (Keyboard.GetState().IsKeyDown(Keys.W))
                        {
                            posicaoSeta.Y = Window.ClientBounds.Height / 2 + 43;
                            jogadores = 1;
                        }

                        if (Keyboard.GetState().IsKeyDown(Keys.S))
                        {
                            posicaoSeta.Y = Window.ClientBounds.Height / 2 + 62;
                            jogadores = 2;
                        }

                        if (Keyboard.GetState().IsKeyDown(Keys.Escape))
                        {
                            posicaoSeta.Y = Window.ClientBounds.Height / 2 + 43;
                            multplayer = false;
                        }

                        if (Keyboard.GetState().IsKeyUp(Keys.Enter))
                        {
                            comecar = true;
                        }
                    }

                    break;

                case EstadoJogo.PLAY:
                    Colizao();
                    comecar = false;
                    bool pausePress = false;
                    bool pausado = teclado.IsKeyDown(Keys.Escape);
                    heroi.pause = pause;
                    
                    if (teclado.IsKeyDown(Keys.Escape) && pausePress == false)
                    {
                        pausePress = true;
                        animacaoSeta.posicao = new Vector2(290, 250);
                        pause = true;   
                    }

                    if (teclado.IsKeyUp(Keys.Escape) == false)
                    {
                        pausePress = false;
                    }

                    if (pause)
                    {
                        Pause();
                        animacaoSetaJogo.Update(gameTime);
                        animacaoPause.Update(gameTime);
                        if (teclado.IsKeyDown(Keys.Enter) && enterPress == false)
                        {
                            enterPress = true;
                            
                            if (menuJogo == 0)
                            {
                                pause = false;
                                heroi.pause = false;
                            }

                            if (menuJogo == 1)
                            {
                                estadoJogo = EstadoJogo.TITULO;
                                pause = false;
                                heroi.pause = false;

                                foreach (Inimigo ini in listaInimigos)
                                {
                                    ini.ativo = false;
                                    tempoInimigoTotal = TimeSpan.Zero;
                                }

                            } 
                        }

                        if (teclado.IsKeyUp(Keys.Enter))
                        {
                            enterPress = false;
                        }

                        if (teclado.IsKeyDown(Keys.W))
                        {
                            menuJogo = 0;
                            animacaoSetaJogo.posicao = new Vector2(335, 288);
                        }

                        if (teclado.IsKeyDown(Keys.S))
                        {
                            menuJogo = 1;
                            animacaoSetaJogo.posicao = new Vector2(335, 320);
                        }
                    }

                    if (heroi.movimento == true)
                    {
                        heroi2.posicao.Y += heroi2.velocidadeHeroiYm;
                    }

                    if (heroi2.posicao.Y > graphics.PreferredBackBufferHeight - 73)
                    {
                        heroi.mover = false;
                    }
                    else
                    {
                        heroi.mover = true;
                    }

                    if (heroi2.movimento == true)
                    {
                        heroi.posicao.Y += heroi.velocidadeHeroiY;
                    }

                    // Mapa
                    animacaoMapa.Update(gameTime);
                    //animacaoMapa.posicaoInicial.Y -= 1;
                
                    // Heroi
                    heroi.Update(gameTime);
                   
                    posicaoHeroi = heroi.posicao;
                    
                    tiro = heroi.tiro;
                    tiros = heroi.tiros;
                    heroi.listaInimigos = listaInimigos;
                    heroi.mapa = animacaoMapa;
                    heroi2.mapa = animacaoMapa;

                    if (jogadores == 2)
                    {
                        Colizao2();
                        
                        tiro2 = heroi2.tiro;
                        tiros2 = heroi2.tiros;
                        heroi2.Update(gameTime);
                        posicaoHeroi2 = heroi2.posicao;
                        heroi2.listaInimigos = listaInimigos;
                    }
                    

                    tempoInimigoTotal += gameTime.ElapsedGameTime;

                    if (tempoInimigoTotal > tempoInimigo)
                    {
                        //AddInimigos(gameTime);
                    }
                    
                    // Inimigos
                    for (int i = 0; i < listaInimigos.Count; i++)
                    {
                        listaInimigos[i].Update(gameTime);
                        listaInimigos[i].posicaoHeroi = posicaoHeroi;

                        if (jogadores == 2)
                        {
                            listaInimigos[i].posicaoHeroi2 = posicaoHeroi2;
                        }
                    }

                    for (int i = 0; i < explosoes.Count; i++)
                    {
                        explosoes[i].Update(gameTime);
                    }
                        break;

                case EstadoJogo.GAMEOVER:
                        break;
            }

            base.Update(gameTime);
        }

        protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.Black);

            spriteBatch.Begin();

            switch (estadoJogo)
            {
                case EstadoJogo.TITULO:
                    spriteBatch.Draw(imagemTitulo, new Rectangle(0, 0, graphics.PreferredBackBufferWidth, graphics.PreferredBackBufferHeight), new Rectangle(0, 0, imagemTitulo.Width, imagemTitulo.Height), Color.White);
                    animacaoSeta.Draw(spriteBatch);
                    
                    if (multplayer == false)
                    {
                        spriteBatch.Draw(selecaoInicio, new Vector2(Window.ClientBounds.Width / 2 - 100, Window.ClientBounds.Height / 2 + 50), new Rectangle(0, 0, selecaoInicio.Width, selecaoInicio.Height), Color.White, 0f, Vector2.Zero, .5f, SpriteEffects.None, 0);
                    }

                    if (multplayer == true)
                    {
                        spriteBatch.DrawString(fonte, "1 Jogador", new Vector2(Window.ClientBounds.Width / 2 - 100, Window.ClientBounds.Height / 2 + 58), Color.White);
                        spriteBatch.DrawString(fonte, "2 Jogadores", new Vector2(Window.ClientBounds.Width / 2 - 100, Window.ClientBounds.Height / 2 + 78), Color.White);
                    }
                    
                    break;

                case EstadoJogo.PLAY:
                    animacaoMapa.Draw(spriteBatch);
                    multplayer = false;

                    for (int i = 0; i < listaInimigos.Count; i++)
                    {
                        listaInimigos[i].Draw(spriteBatch);
                    }

                    if (jogadores == 2)
                    {
                        for (int i = 0; i < tiros2.Count; i++)
                        {
                            tiros2[i].Draw(spriteBatch);
                        }

                        heroi2.Draw(spriteBatch);
 
                    }
                
                    // Desenhar os basic Atks
                    for (int i = 0; i < tiros.Count; i++)
                    {
                        tiros[i].Draw(spriteBatch);
                    }
                    
                    heroi.Draw(spriteBatch);
                   
                    //spriteBatch.Draw(texturaRetangulo, heroi.retangulo, Color.White);

                    for (int i = 0; i < explosoes.Count; i++)
                    {
                        explosoes[i].Draw(spriteBatch);
                    }

                    if (pause)
                    {
                        //spriteBatch.Draw(texturaPause, new Vector2(Window.ClientBounds.Width / 2 - texturaPause.Width / 2, Window.ClientBounds.Height / 2 - texturaPause.Height / 2), Color.White);
                        animacaoPause.Draw(spriteBatch);
                        animacaoSetaJogo.Draw(spriteBatch);
                    }

                    spriteBatch.Draw(imagemHud, new Vector2(0, 0), Color.Wheat);
                    spriteBatch.Draw(texturaHp, new Vector2(114, 9), new Rectangle(0, 30 * dano, 183, 30), Color.White);
                    spriteBatch.Draw(texturaHp, new Vector2(508, 9), new Rectangle(0, 30 * dano2, 183, 30), Color.White);
                    
                    spriteBatch.DrawString(fonte, "Score", new Vector2(310, 5), Color.White, 0, Vector2.Zero, .8f, SpriteEffects.None, 0);
                    spriteBatch.DrawString(fonte, "Score", new Vector2(700, 5), Color.White, 0, Vector2.Zero, .8f, SpriteEffects.None, 0);
                    spriteBatch.DrawString(fonte, score.ToString(), new Vector2(310, 19), Color.White, 0, Vector2.Zero, .9f, SpriteEffects.None, 0);
                    spriteBatch.DrawString(fonte, score2.ToString(), new Vector2(700, 19), Color.White, 0, Vector2.Zero, .9f, SpriteEffects.None, 0);

                    //if (vida == 1)
                    //{
                    //    spriteBatch.Draw(imagemVida, new Vector2(650, 45), Color.White);
                    //}

                    //if (vida == 2)
                    //{
                    //    spriteBatch.Draw(imagemVida, new Vector2(650, 45), Color.White);
                    //    spriteBatch.Draw(imagemVida, new Vector2(700, 45), Color.White);
                    //}
                    
                    //if (vida == 3)
                    //{
                    //    spriteBatch.Draw(imagemVida, new Vector2(650, 45), Color.White);
                    //    spriteBatch.Draw(imagemVida, new Vector2(700, 45), Color.White);
                    //    spriteBatch.Draw(imagemVida, new Vector2(750, 45), Color.White);
                    //}

                    //if (vida > 3)
                    //{
                    //    spriteBatch.Draw(imagemVida, new Vector2(650, 45), Color.White);
                    //    spriteBatch.DrawString(fonte, "X " + vida, new Vector2(710, 55), Color.White);
                    //}
                    
                    break;

                case EstadoJogo.GAMEOVER:
                    spriteBatch.Draw(imagemGameOver, Vector2.Zero, Color.White);
                    break;
            }

            spriteBatch.End();

            base.Draw(gameTime);
        }
    }
}
